Appearance
附录B 块作用域的替代方案
第 3 章深入研究了块作用域。 至少从ES3发布以来,JavaScript中就有了块作用域, 而 with和catch分句就是块作用域的两个小例子。
但随着ES6中引入了let,我们的代码终于有了创建完整、 不受约束的块作用域的能力。 块作用域在功能上和代码风格上都拥有很多激动人心的新特性。
但如果我们想在ES6之前的环境中使用块作用域呢?
考虑下面的代码:
JS
{
let a = 2;
console.log( a ); // 2
}
console.log( a ); // ReferenceError
这段代码在ES6环境中可以正常工作。 但是在ES6之前的环境中如何才能实现这个效果? 答案是使用catch。
JS
try { throw 2;} catch (a){
console.log( a ); // 2
}
console.log( a ); // ReferenceError
天啊! 这些代码既丑陋又奇怪。 我们看见一个会强制抛出错误的try/catch,但是它抛出
的错误就是一个值 2 ,然后catch分句中的变量声明会接收到这个值。头疼!
没错,catch分句具有块作用域, 因此它可以在ES6之前的环境中作为块作用域的替代 方案。
“但是, ”你可能会说, “鬼才要写这么丑陋的代码!” 没错, 没人写的代码像CoffeeScript 编译器输出的代码,但这不是重点。
重点是工具可以将ES6的代码转换成能在ES6之前环境中运行的形式。 你可以使用块作用 域来写代码, 并享受它带来的好处, 然后在构建时通过工具来对代码进行预处理, 使之可 以在部署时正常工作。
事实上, 这是向ES6中的所有( 好吧, 不是所有而是大部分)功能迁移的首选方式: 在从 ES6之前的环境向ES6过渡时, 使用代码转换工具来对ES6代码进行处理, 生成兼容ES5 的代码。
你不知道的 JavaScript